﻿using AbpVnext_Module;
using AbpVnext_Module.Repository;
using Ebusiness_Domain.DomainEvent;
using Ebusiness_Domain.IRepository;
using Ebusiness_Domain.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices.Marshalling;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Uow;

namespace Ebusiness_Domain.DomainService
{
    /// <summary>
    /// （商品）领域服务 将聚合根里面保存到数据库的操作分离出来,业务逻辑层，在添加商品到仓储层之前，做一些业务处理，比如校验商品图片是否合法
    ///   操作聚合根，不能操作聚合根以下的实体
    /// </summary>
    public class ProductMannage
    {
        public IProductRepository productRepository { get; set; }

        public IProductImageRepository productImageRepository { get; set; }

        public ProductMannage(IProductRepository productRepository)
        {
            this.productRepository = productRepository;
        }



        /// <summary>
        /// 领域事件 
        /// 操作实体根
        /// </summary>
        public ProductEventHandle productEventHandle { get; set; }

        /// <summary>
        /// 添加商品
        /// 业务逻辑层（BLL），在添加商品到仓储层之前，做一些业务处理，比如校验商品图片是否合法
        /// 操作聚合根，不能操作聚合根以下的实体
        /// </summary>
        /// <param name="product"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void InsertProduct(Product product)
        {
            //1、查询商品
            //productRepository
            //2、判断商品名称不能重复
            //if(productName == "name")
            //3、添加
            productRepository.InsertProduct(product);
        }

        /// <summary>
        /// 添加商品图片图片
        /// </summary>
        /// <param name="product"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public void InsertProductImage(Product product)
        {
            productRepository.InsertProductImage(product);

            //添加商品触发领域事件 ，通知其他系统
            AddProductEvent @event = new AddProductEvent();
            @event.product = product;
            productEventHandle.Hnadle(@event);
        }

        /// <summary>
        /// 规约 : 操作实体条件
        ///    业务：查询商品
        ///      规则一：查询名称 > 10 个字符的商品
        ///      规则二：查询价格 > 999 个字符的商品
        /// </summary>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public List<Product> GetProducts(Product product)
        {
            List<Product> products = productRepository.GetProducts();
            return products.Where(x => x.ProductName.Length > 10 && x.ProductPrice > 999).ToList();
        }
    }
}
